Générer un programme ******************** Un typage statique ================== Le langage C++ dispose d'un **typage statique**. Cela signifie que les types de toutes les variables sont déterminés au moment de la compilation, plutôt qu'à l'exécution. Ainsi, le type de chaque variable doit être * déclaré explicitement par le programmeur * inféré par le compilateur (par exemple le résultat de 5+6.0 est un double) Cela implique qu'aucune variable n'est autorisée à changer de type durant l'exécution du programme, d'où le terme de statique. De cette façon, aucun temps n'est perdu durant l'exécution du programme à effectuer des vérifications sur les types des variables, d'où un gain de performance. .. quiz:: TypageFort :title: Que représente le typage statique ? Indiquez si les affirmations suivantes sont vraies ou fausses : #) :quiz:`{"type":"TF","answer":"F"}` Si le langage utilise le typage statique, les variables ne peuvent pas changer de valeur. #) :quiz:`{"type":"TF","answer":"F"}` Le typage statique permet de détecter toutes les erreurs dans un programme. #) :quiz:`{"type":"TF","answer":"T"}` Le typage statique interdit à une variable d'avoir plusieurs types durant l'exécution. #) :quiz:`{"type":"TF","answer":"T"}` Le typage statique permet de détecter des erreurs entre types incompatibles avant l'exécution du programme. #) :quiz:`{"type":"TF","answer":"T"}` Le typage statique permet une efficacité accrue des programmes. Les éléments présents dans le code C++ ====================================== Nous précisons ci-dessous les principaux éléments de la structure du C++ : * Le commentaires * Les noms (identifiants) * Les mots-clefs * Les littéraux * Les signes Les commentaires ---------------- Plusieurs possibilités : * Soit placés en fin de ligne et précédés par // * Soit sur plusieurs lignes et délimités par /* et * / Les noms -------- Le C++ permet au programmeur de nommer librement les variables, les tableaux, les fonctions, les structures et les classes. Ces **noms** (**name**) sont appelés aussi des **identifiants** (**identifiers**). `Les identifiants `_ doivent respecter les mêmes règles : * Un identifiant doit commencer par une lettre ou par un trait _ de soulignement. En conséquence, aucun identifiant ne peut commencer par un chiffre. * Pas de caractères spéciaux ou d'espaces à l'intérieur d'un identifiant. * Pas de mots-clés. .. note:: En C++, les caractères majuscules et minuscules ont des significations différentes. On dit que le langage est **sensible à la casse**. Ainsi, *Total* et *total* sont considérés comme deux identifiants différents, associés par exemple à deux variables distinctes. Les mots-clefs -------------- Un **mot-clef** (**keyword**) appelé aussi un mot réservé, représente un mot appartenant à la liste des mots réservés du langage. Cette liste est établie par la `norme du langage `_ qui évolue en fonction des versions du C++. Il est interdit d'utiliser ces mots-clefs comme identifiant. Dans le tableau ci-dessous, nous vous présentons les plus classiques qui vous seront sûrement déjà familiers. **Exemple de mots-clefs du C++** .. csv-table:: :widths: 1,1,1,1,1,1,1,1,1,1 bool, char, class, do, double,else, false, float, for, if int, return, unsigned, this, true, void, while Les mots-clefs tiennent différents rôles : * true et false : correspondent à des *constantes* de type booléen. * bool, char, float, double, int, void : sont associés aux types du C++. * if, for, while : représentent des instructions du langage servant à gérer le flux de contrôle d'un programme. Les littéraux ------------- Un **littéral** (**literal**) désigne une valeur écrite dans le code source du programme. On trouve aussi le terme de **constante** (**constant**) utilisé de manière similaire dans la communauté. Ils sont divisés en sous-catégories : * `Les littéraux des nombres entiers `_ * 4897 : forme décimale * 0b110101010 : forme binaire * 0xFF23 : forme hexadécimale * `Les littéraux des nombres flottants `_ * 8.235 : nombre flottant de type double * `Les littéraux booléens `_ * true/false : valeurs booléennes * `Les littéraux de tableau de caractères `_ * \"Bonjour\" : tableau de caractères Les signes ---------- Il existe une liste de signes en C++ appelés Ponctuators (anglicisme) : ! % ^ & * ( ) - + = { } | ~ [ ] \ ; ' : " < > ? , . / Chacun de ces signes, suivant le contexte où il est utilisé, peut prendre des significations différentes. Prenons le cas de la paire de parenthèses : * Dans l'écriture : *a = fnt()*, elles représentent un appel de fonction. * Dans l'écriture : *4/(5-a)*, elles indiquent l'ordre dans lequel un calcul sera effectué. * Dans l'écriture : *void fnt(int a)*, elles permettent de lister les paramètres d'une fonction. Vous pouvez retrouver `pour chaque signe sa liste d'interprétations possibles `_. Par exemple, les accolades { } sont des signes servant de **délimiteurs** pour isoler un bloc de code. Comme autres signes fréquemment utilisés, on trouve les opérateurs arithmétiques : + - / .. quiz:: Keywordcpp :title: La syntaxe du C++ Indiquez si les affirmations suivantes sont vraies ou fausses : #) :quiz:`{"type":"TF","answer":"T"}` 8.235 est un littéral. #) :quiz:`{"type":"TF","answer":"T"}` for, while sont des mots-clefs du C++. #) :quiz:`{"type":"TF","answer":"F"}` On peut choisir int comme nom de variable. #) :quiz:`{"type":"TF","answer":"F"}` Le C++ est un langage non sensible à la casse. #) :quiz:`{"type":"TF","answer":"F"}` Une paire de parenthèses correspond toujours à un appel de fonction. #) :quiz:`{"type":"TF","answer":"F"}` Le développeur peut définir de nouveaux mots-clefs. #) :quiz:`{"type":"TF","answer":"T"}` Les accolades sont des signes du langage C++. La génération ============= La **génération** d'un programme (**build** en anglais) désigne le processus consistant à transformer des codes sources au format texte en programme exécutable sur un type de machines donné. Ce processus repose sur deux actions : * La **compilation** qui transforme 1 fichier source (.cpp) en 1 **fichier objet** avec l'extension .obj sous Windows et .o sous Linux. Un fichier objet correspond grosso-modo à un morceau du programme final. Un utilitaire pouvant accomplir cette tâche est appelé compilateur. * La **liaison** (ou **link** en anglais) qui fusionne les différents fichiers objets pour obtenir le programme exécutable final. Un utilitaire pouvant effectuer cette tâche s'appelle un **éditeur de liens** (**linker** en anglais). Le compilateur et l'éditeur de liens peuvent être des programmes séparés ou un même programme, cela n'a pas d'importance pour le processus. Voici un schéma qui représente le traitement des différents fichiers sources et des fichiers objets durant l'étape de Build : .. image:: _compil.png :scale: 50% :align: center .. note:: Les fichiers sources sont compilés indépendamment. Cela signifie que lorsqu'un fichier source est compilé, il n'a pas connaissance du contenu des autres fichiers sources ! Cela peut vous paraître étrange, mais il y a un avantage à cela. En effet, lorsqu'on modifie un fichier source et que l'on relance la séquence de Build, seul ce fichier source est recompilé, les autres fichiers objets sont conservés tels quels. L'étape de liaison doit, dans tous les cas, reprendre la totalité de ses traitements dès qu'un fichier source est modifié. Pour mettre en place l'étape de Build, plusieurs approches sont possibles : * Le terminal dans lequel vous lancez manuellement ces opérations. * L'utilisation d'un utilitaire (comme Make ou CMake) automatisant le process de build en utilisant des fichiers texte pour décrire les étapes à effectuer. * L'utilisation d'un environnement de développement vous permettant par un clic sur l'icône de Build de générer le projet complet. .. warning:: Dans le langage oral, on remplace souvent l'expression "générer un programme" par l'expression "compiler un programme". Cela vient du fait que lors d'un build, l'étape de compilation prend le plus de temps, l'étape de liaison étant rapidement effectuée à la fin du processus. L'étape de compilation produit des erreurs de compilation ! Ces dernières concernent essentiellement la syntaxe du programme. Chaque erreur de syntaxe est localisée dans un fichier source à une position précise. L'étape de liaison produit des erreurs de liaison ! Par exemple, une erreur de liaison se produit lorsqu’une fonction est appelée dans le programme alors qu'aucun code associé à cette fonction n'a été trouvé dans l'ensemble des fichiers sources. .. quiz:: Trad :title: Traduction Indiquez si les affirmations suivantes sont vraies ou fausses : #) :quiz:`{"type":"TF","answer":"F"}` L'étape de compilation traduit un fichier objet en fichier exécutable. #) :quiz:`{"type":"TF","answer":"F"}` Si vous avez 3 fichiers .cpp et un fichier .exe, vous aurez 4 fichiers objets. #) :quiz:`{"type":"TF","answer":"F"}` L'étape de liaison a lieu avant l'étape de compilation. #) :quiz:`{"type":"TF","answer":"T"}` Un fichier source est recompilé lorsqu'il est mis à jour. #) :quiz:`{"type":"TF","answer":"T"}` Un build représente la traduction du code source en programme exécutable.